「雖然說是各有優缺,但實際上,在程式設計裡 ArrayList 幾乎是預設選擇。」學長聳聳肩,語氣很肯定,「因為效能、快取友善度、記憶體效率都更好。」
我皺著眉頭,忍不住反駁:「難道不是 ArrayList 的做法比較浪費記憶體嗎?畢竟每次容量不夠,就得整批重新搬家,不是很麻煩嗎?」
「聽起來是這樣沒錯,但實際上大小通常是可以預測的。」學長解釋,「只要一開始抓個大概的容量,就不需要一直搬來搬去。反倒是 LinkedList,每個節點除了存值,還得多存一個指標。長久下來,記憶體開銷更大。」
「喔⋯⋯」我點點頭,腦中浮現換場地時,不但要帶著場地設備,還要額外背一個箭頭標示牌,好沈重⋯⋯
「還有更關鍵的地方,」學長把手指輕敲桌子,強調道,「CPU 在存取資料時,通常會一口氣把一段連續的記憶體搬進快取。ArrayList 剛好就是連續的,所以讀取起來飛快。但 LinkedList 的記憶體是零零落落的,CPU 得到處跑來跑去,累得半死,才能湊齊資料。」
我忍不住插嘴:「可是,你之前不是說過 LinkedList 在插入、刪除比較方便嗎?這樣總該有某些場合比較合適吧?」
學長笑著搖頭:「方便是方便,但有前提——你得先找到那個位置。問題是 LinkedList 找位置本來就慢,要一個個順著指標找下去。等你找到,再去插入或刪除,整體還是慢得驚人。所以綜合下來,大多數情況 ArrayList 更實用。」
我歪著頭問:「那我們幹嘛還要學 LinkedList?」
「哈哈,因為演算法題會考啊。」學長拍了拍我的肩,「在演算法世界裡,題目不會乖乖告訴你目標大小,很多情境都設計得很特殊。這時 LinkedList 就能派上用場。但是我們平時寫程式的話,十之八九還是用 ArrayList。」